import { readdir, readFile, writeFile, access } from 'fs/promises';
import { existsSync } from 'fs';
import path from 'path';
import fsExtra from 'fs-extra';

// 要处理的目录
const SRC_DIR = path.resolve(process.cwd(), 'src');

/**
 * 递归遍历目录，处理所有index.vue文件
 */
async function processDirectory(directory) {
  try {
    const entries = await readdir(directory, { withFileTypes: true });
    
    for (const entry of entries) {
      const fullPath = path.join(directory, entry.name);
      
      if (entry.isDirectory()) {
        // 递归处理子目录
        await processDirectory(fullPath);
      } else if (entry.isFile() && entry.name === 'index.vue') {
        // 处理index.vue文件
        await processVueFile(fullPath);
      }
    }
  } catch (error) {
    console.error(`处理目录 ${directory} 时出错:`, error);
  }
}

/**
 * 处理单个Vue文件，提取样式并生成CSS文件
 */
async function processVueFile(vueFilePath) {
  try {
    // 读取Vue文件内容
    const vueContent = await readFile(vueFilePath, 'utf8');
    
    // 匹配<style scope>标签及其内容的正则表达式
    const styleRegex = /<style\s+scoped\s*>\s*([\s\S]*?)\s*<\/style>/i;
    const match = vueContent.match(styleRegex);
    
    if (!match) {
      // 没有找到<style scope>，跳过
      console.log(`未在 ${vueFilePath} 中找到<style scope>，跳过`);
      return;
    }
    
    const [styleBlock, cssContent] = match;
    
    // 生成CSS文件路径
    const dirPath = path.dirname(vueFilePath);
    const cssFilePath = path.join(dirPath, 'index.css');
    
    // 写入CSS内容
    await writeFile(cssFilePath, cssContent, 'utf8');
    console.log(`已生成CSS文件: ${cssFilePath}`);
    
    // 替换Vue文件中的<style scope>为@import语句
    const newVueContent = vueContent.replace(
      styleRegex,
      `
      <style scoped>
        @import './index.css';
      </style>
      `
    );
    
    // 写入修改后的Vue文件
    await writeFile(vueFilePath, newVueContent, 'utf8');
    console.log(`已更新Vue文件: ${vueFilePath}`);
    
  } catch (error) {
    console.error(`处理文件 ${vueFilePath} 时出错:`, error);
  }
}

// 开始处理
async function start() {
  try {
    // 检查src目录是否存在
    await access(SRC_DIR);
    console.log(`开始处理目录: ${SRC_DIR}`);
    await processDirectory(SRC_DIR);
    console.log('处理完成');
  } catch (error) {
    console.error(`错误: 目录 ${SRC_DIR} 不存在或无法访问`);
  }
}

// 执行脚本
start();
    